package com.alquimia.truco.dominio.modelo;

import java.util.*;

/**
 * Created by Ivo on 06/07/2014.
 */
public class Ronda {

    private Deque<Jugada> jugadas;
    private Mazo mazo;
    private Map<JugadorId, Jugador> jugadores;

    protected Ronda(Map<JugadorId, Jugador> aJugadores) {
        this();
        setJugadores(aJugadores);
    }

    protected Ronda() {
        super();
        setJugadas(new ArrayDeque<>());
        setMazo(new Mazo());
    }

    protected void nuevaRonda() {

        jugadas().clear();
        mazo().barajar();
        repartirCartas();
    }

    protected void nuevaJugada(JugadorId aJugadorId, Accion aEstadoAccion) {

        if (aEstadoAccion.esUnaAccionDeFinalizacion())
            indentificarGanador(aJugadorId, aEstadoAccion);
        else
            enviarOpcionesDeJugada();
    }

    protected void nuevaJugada(JugadorId aJugadorId, Accion aEstadoAccion, Carta aCarta) {

        if (aEstadoAccion.esUnaAccionDeFinalizacion())
            indentificarGanador(aJugadorId, aEstadoAccion);
        else
            enviarOpcionesDeJugada();
    }

    private void indentificarGanador(JugadorId aJugadorId, Accion aEstadoAccion) {

    }

    private void enviarOpcionesDeJugada() {

    }

    private void repartirCartas() {
        for (Jugador mJugador : jugadores().values())
            mJugador.nuevasCartas(mazo().obtenerCartas(3));
    }

    protected Mazo mazo() {
        return this.mazo;
    }

    private void setMazo(Mazo aMazo) {
        this.mazo = aMazo;
    }

    private void setJugadas(ArrayDeque<Jugada> aJugadas) {
        this.jugadas = aJugadas;
    }

    private Deque<Jugada> jugadas() {
        return this.jugadas;
    }

    private Map<JugadorId, Jugador> jugadores() {
        return this.jugadores;
    }

    private void setJugadores(Map<JugadorId, Jugador> aJugadores) {
        this.jugadores = aJugadores;
    }

    public Accion[] accionesRealizadas(JugadorId aJugadorId) {

        final EnumSet<Accion> mAcciones = EnumSet.noneOf(Accion.class);

        this.jugadas().parallelStream().filter(
                e -> e.jugadorId().equals(aJugadorId))
                .iterator().forEachRemaining(e -> mAcciones.add(e.accion()));

        return mAcciones.toArray(new Accion[0]);
    }

}
